--请求最大次数
local limit = tonumber(ARGV[1])
--窗口大小
local window = tonumber(ARGV[2])
-- 告警阀值
local warn = tonumber(ARGV[3])
-- 当前值
local current = redis.call("INCRBY", KEYS[1], 1)
--如果是第一次请求,则设置过期时间并返回
if current == 1 then
    redis.call("expire", KEYS[1], window)
end
-- 0: 被拦截， 1： 通过， 2： 刚好达到上限， 3：告警（warn~limit之间）
if warn == limit then
    --通过
    if current < limit then
        return 1
    --达到上限
    elseif current == limit then
        return 2
    --被拦截
    else
        return 0
    end
else
    -- 通过
    if current < warn then
        return 1
    -- 告警
    elseif current < limit then
        return 3
    -- 达到上限
    elseif current == limit then
        return 2
    -- 被拦截
    else
        return 0
    end
end